Эта статья является частью учебника "Разработка компонента MVC для Joomla 4.x". Он предназначен для последующего руководства по программированию, поэтому, если вы не читали предыдущие части руководства, вам рекомендуется сделать это. Предыдущая статья этого пособия была на тему «Добавление модели для фронтенда в компонент на Joomla 4.x». Для понимания излагаемого материала рекомендуется читать и сразу выполнять приводимые в публикациях данные.
- Добавление переменной запроса в ссылку меню
- Необходимые изменения в коде файлов компонента Joomla 4
- Содержимое файлов компонента для Joomla 4.x
- Тестирование компонента в Joomla 4 с внесёнными дополнениями
Добавление переменной запроса в ссылку меню
Теперь у нас есть страница на сайте (фронтенде) нашей установки Joomla, которая может отображать приветственное сообщение, предоставленное моделью данных. В этой статье рассмотрим, как добавить переменную запроса в ссылку меню, созданную ранее, и узнаем, как прочитать переменную запроса внутри модели данных. В зависимости от выбранного в админке значения переменной мы покажем разные приветствия.
Необходимые изменения в коде файлов компонента Joomla 4
Есть два основных изменения, которые нам нужно будет сделать:
- Добавление переменной запроса и ее возможных значений в XML-определение ссылки меню.
- Добавление кода в модель для чтения переменной запроса и выбора соответствующего приветствия.
- Обновление:
site/tmpl/hello/default.xml
- Добавление нового параметра в определение ссылки меню.
- Обновление:
site/src/Model/MessageModel.php
- Пусть модель данных представления решит, какое приветствие возвращать.
- Обновление:
admin/language/en-GB/en-GB.com_helloworld.sys.ini
- Добавление новых языковых констант, необходимых при настройке ссылки меню.
- Обновление:
site/language/en-GB/en-GB.com_helloworld.ini
- Замена существующей строки приветствия на два приветствия, которые можно будет выбрать.
- Обновление:
helloworld.xml
- Для согласованности увеличивает номер версии компонента в файле манифеста.
Содержимое файлов компонента для Joomla 4.x
site/tmpl/hello/default.xml
Хотя это изменение может показаться довольно многословным, на самом деле оно очень простое. Мы добавляем настраиваемую переменную запроса (называемую "field
") в нашу ссылку меню. При редактировании пункта меню в панели управления Joomla это поле и его параметры будут отображаться в форме выбора конфигурации пункта меню.
Поля (fields
) меню организованы в наборы fieldset
, хотя здесь мы будем использовать только один. Мы назовем наше поле GreetingType
, которое будет добавлено к URL-адресу при нажатии на ссылку. Мы также заранее определяем, какие значения (value
) разрешены для этого поля, поскольку мы хотим иметь возможность полагаться на их значения в модели данных. Мы делаем это с помощью type="list"
, чтобы сообщить Joomla, что у него есть список значений, а затем предоставить их в качестве дочерних элементов <option />
.
Атрибут value
каждого <option / >
- это фактическое значение, которое будет добавлено к URL-адресу (например, &GreetingType=1
). Имя (ключ) языковой константы внутри элемента <option />
представляет знание, которое будет отображаться в форме конфигурации при настройке пункта меню а админке Joomla 4.
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE">
<message><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_DESC]]></message>
</layout>
<fields name="request">
<fieldset name="request">
<field name="greetingType"
type="list"
label="COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_LABEL"
description="COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_DESC"
default="1">
<option value="1"><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_HELLO]]></option>
<option value="2"><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_GOODBYE]]></option>
</field>
</fieldset>
</fields>
</metadata>
Обратите внимание на строки:
- стр.7..18 — вставка информации о полях (
fields
), используемых для формирования ссылки пункта меню компонента при его настройке в админке Joomla 4.
site/src/Model/MessageModel.php
Здесь мы читаем в новой переменной запроса через фреймворк Joomla и решаем, какое из наших двух приветствий показывать. Этот код иллюстрирует, как читать переменные запроса в Joomla 4:
Factory::getApplication()
возвращает объект приложения Joomla 4. Вы будете часто использовать этот код при написании в Joomla в качестве точки входа в среду выполнения Joomla.->GetInput()
возвращает объект\Joomla\Input\Input
для этого запроса. Этот объект можно использовать для безопасного чтения переменных запроса.$input->getInt('GreetingType', 1);
извлекает значение переменной запроса 'GreetingType
', которую мы определили ранее. Если значение не определено, мы указали, что оно должно возвращать значение по умолчанию1
.
ВАЖНО: Вы никогда не должны использовать для чтения данных, переданных приложению Joomla, глобальные переменные PHP, такие как $_GET
или $_POST
, для доступа к переменным запроса или другим входным данным. Используйте фреймворк Joomla для доступа к любым переданным или переданным данным, чтобы не параноить по поводу того, что они содержать какой-то вредоносный код, отправленный хакером-самоучкой для взлома сайта, и действительно ли они правильно обработаны и очищены.
С переменной чтения запроса мы просто выбираем, какое из наших двух возможных приветствий должно быть подставлено в шаблон нашего компонента.
<?php
namespace JohnSmith\Component\HelloWorld\Site\Model;
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\ItemModel;
use Joomla\CMS\Language\Text;
/**
* @package Joomla.Site
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2021 John Smith. All rights reserved.
* @license GNU General Public License version 3; see LICENSE
*/
/**
* Модель сообщения Hello World
* @since 0.0.5
*/
class MessageModel extends ItemModel {
/**
* Возвращает сообщение для отображения
* @param integer $pk Первичный ключ "элемента сообщения", в настоящее время не используется
* @return object Message Объект сообщения
*/
public function getItem($pk= null): object {
// Это дает нам объект Joomla\Input\Input
$input = Factory::getApplication()->getInput();
$greetingType = $input->getInt('greetingType', 1);
$item = new \stdClass();
switch($greetingType) {
case 2:
$item->message = Text::_('COM_HELLOWORLD_MSG_GREETING_GOODBYE');
break;
case 1:
default:
$item->message = Text::_('COM_HELLOWORLD_MSG_GREETING_HELLO');
break;
}
return $item;
}
}
Обратите внимание на строки:
- стр.7 — подключение класса ядра Joomla 4
Joomla\CMS\Factory
- стр.31..33 — получение объекта
Joomla\Input\Input
классаJoomla\CMS\Factory
Joomla 4 - стр.37..45 — условия выбора языковой константы в зависимости от полученных данных в переменной
$greetingType
, которые мы получили выше из обработки запроса.
admin/language/en-GB/en-GB.com_helloworld.sys.ini
Здесь мы определяем языковые константы, которые будут использоваться в форме конфигурации пункта меню в админке Joomla 4 для нашей ссылки меню. Помните, что, хотя ссылка меню определена во фронтенде сайта шаблона компонента, строки определены здесь, потому что она используется в панели управления Joomla.
; Hello World Sys.ini
; Copyright (C) 2021 John Smith. All rights reserved.
COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE="Hello World!"
COM_HELLOWORLD_MENU_HELLO_WORLD_DESC="My first Joomla! page"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_LABEL="Greeting Type"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_DESC="Select which type of greeting to show"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_HELLO="Say Hello"
COM_HELLOWORLD_MENU_HELLO_WORLD_PARAM_VALUE_GOODBYE="Say Goodbye"
Обратите внимание на строки:
- стр.6..9 — новые языковые константы компонента для вывода информации при формировании ссылке меню в админке Joomla
site/language/en-GB/en-GB.com_helloworld.ini
Здесь мы используем вместо нашего старого приветствия два разных приветствия, между которыми модель будет выбирать на основе значения переменной запроса GreetingType
.
; Hello World Public Site Strings
; Copyright (C) 2020 John Smith. All rights reserved.
COM_HELLOWORLD_MSG_HELLO_WORLD="Hello World!"
COM_HELLOWORLD_MSG_GREETING_GOODBYE="Goodbye from the item model!"
COM_HELLOWORLD_MSG_GREETING_HELLO="Hello from the item model!"
Обратите внимание на строки:
- стр.5..6 — новые языковые константы компонента для вывода информации на сайте в соответствии с настройками пункта меню.
helloworld.xml
Как и прежде, наша последняя задача - это увеличить номер версии компонента. Ни одно из внесенных здесь изменений не требует, чтобы номер версии был изменен перед повторным импортом, но мы сделаем это для согласованности.
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
<name>Hello World</name>
<!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
<creationDate>May 2021</creationDate>
<!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
<author>John Smith</author>
<authorUrl>https://mb4.ru</authorUrl>
<copyright>Пётр Васечкин</copyright>
<license>GPL v3</license>
<!-- Строка 'version' записывается в таблицу компонентов -->
<version>0.0.6</version>
<!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
<description>
A hello world component!
</description>
<!-- Это пространство имен PHP, в котором организован
код расширения. Он должен следовать этому формату:
Vendor\Component\ComponentName
"Vendor" может быть названией компании или вашим собственным именем
Раздел "ComponentName" ДОЛЖЕН соответствовать имени, используемому
везде для вашего компонента. Каким бы ни было имя этого XML-файла,
пространство имен должно совпадать (заглавные/прописные буквы не учитываются).
-->
<namespace path="src/">JohnSmith\Component\HelloWorld</namespace>
<files folder="site/">
<folder>language</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<languages>
<language tag="en-GB">site/language/en-GB/en-GB.com_helloworld.ini</language>
</languages>
<administration>
<!-- Ссылка, которая появится в меню админки Joomla "Components" -->
<menu link="index.php?option=com_helloworld">Hello World</menu>
<!-- Список файлов и папок для копирования.
Обратите внимание на атрибут "folder".
Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
<files folder="admin/">
<folder>language</folder>
<folder>services</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<languages>
<language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.sys.ini</language>
</languages>
</administration>
</extension>
Обратите внимание на строку:
- стр.14 — меняется номер версии компонента
Тестирование компонента в Joomla 4 с внесёнными дополнениями
Как и раньше, заархивируйте новую версию компонента и загрузите ее в панель администратора установки Joomla 4.
Как только он обновится, откройте настройки главного меню из левого меню, как вы делали это раньше, затем нажмите ссылку "Hello World" в списке ссылок справа.
Вы должны снова увидеть форму конфигурации ссылки на меню, но теперь должно появиться совершенно новое раскрывающееся окно выбора:
Здесь вы можете увидеть наш новый параметр конфигурации "Greeting Type" (Тип приветствия). Это поле, которое мы определили в XML ранее, используя языковые строки, которые мы также определили. Чтобы проверить изменения, выберите один из возможных типов приветствий и сохраните ссылку меню. Как только ссылка будет сохранена, зайдите на фронтенд вашего сайта на Joomla 4 и нажмите на ссылку в меню сайта. Вы должны увидеть соответствующее выбранному в админке приветствие:
Чтобы убедиться, что переменная запроса работает правильно, не забудьте несколько раз переключить в админке Joomla 4 конфигурацию ссылки меню с разными параметрами. Сообщение на сайте должно изменяться соответствующим образом.
Отлично! Теперь у нас есть страница, берущая простые данные из модели, и эта модель может отвечать на переменные запроса. Дальше мы, наконец, приступим к настройке нашей базы данных и подключим к ней нашу модель данных.
Перевод с английского:
https://docs.joomla.org/J4.x:Developing_an_MVC_Component/Adding_a_Request_Variable_in_the_Menu_Link
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)